package persistance.dal;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import ucc.objects.CaisseDuJourDTO;
import ucc.objects.ProduitDTO;
import ucc.objects.ResumeCaisseDTO;
import ucc.request.UccViewer;
import biz.BizFactory;

public class ResumeCaisseFinderImpl implements ResumeCaisseFinder {

	private PreparedStatement q1;
	private PreparedStatement q2;
	private PreparedStatement q3;
	private PreparedStatement q4;
	private final String Q1 = "select * from caisse.vue_calcul_quantite where id_caisse_du_jour=?";
	private final String Q2 = "select * from caisse.vue_calcul_quantite where id_caisse_du_jour=? and id_produit=?";
	private final String Q3 = "select * from caisse.vue_calcul_quantite_animateur where id_caisse_du_jour=? and id_produit=?";
	private final String Q4 = "select * from caisse.vue_liste_produits_vendus where id_caisse_du_jour=? and id_produit=? and vente_animateur=?";

	public ResumeCaisseFinderImpl() {
		this.q1 = DalBackEndServices.INSTANCE.prepare(Q1);
		this.q2 = DalBackEndServices.INSTANCE.prepare(Q2);
		this.q3 = DalBackEndServices.INSTANCE.prepare(Q3);
		this.q4 = DalBackEndServices.INSTANCE.prepare(Q4);
	}

	public ArrayList<ResumeCaisseDTO> leResumeDeCaissePour(
			CaisseDuJourDTO caisse) {
		ResultSet rs = null;
		ArrayList<ResumeCaisseDTO> listeResumesCaisse = new ArrayList<ResumeCaisseDTO>();
		try {
			q1.setInt(1, caisse.getId());
			rs = q1.executeQuery();
			while (rs.next()) {
				ResumeCaisseDTO resume = BizFactory.INSTANCE
						.createEmptyResumeCaisseDTO();

				resume.setProduit(UccViewer.INSTANCE.leProduitNum(rs
						.getInt("id_produit")));
				resume.setCaisseDuJour(caisse);
				resume.setQuantiteVendu(rs.getInt("quantite_vendu"));
				resume.setPrixTotalDeVente(rs.getDouble("prix_total_vente"));

				listeResumesCaisse.add(resume);
			}
			return listeResumesCaisse;
		} catch (SQLException e) {
			System.out.println("[E][SQL] : ");
			e.printStackTrace();
		}
		return null;
	}

	public ResumeCaisseDTO leResumeDeCaissePour(CaisseDuJourDTO caisse,
			ProduitDTO produit, boolean venteAnimateur) {
		ResultSet rs = null;
		ResumeCaisseDTO resume = null;
		try {
			if (venteAnimateur) {
				q3.setInt(1, caisse.getId());
				q3.setInt(2, produit.getId());
				rs = q3.executeQuery();
			} else {
				q2.setInt(1, caisse.getId());
				q2.setInt(2, produit.getId());
				rs = q2.executeQuery();
			}

			while (rs.next()) {
				resume = BizFactory.INSTANCE.createEmptyResumeCaisseDTO();

				resume.setProduit(produit);
				resume.setCaisseDuJour(caisse);
				resume.setQuantiteVendu(rs.getInt("quantite_vendu"));
				resume.setPrixTotalDeVente(rs.getDouble("prix_total_vente"));
			}
			return resume;
		} catch (SQLException e) {
			System.out.println("[E][SQL] : ");
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public int quantiteVenduPourCaisseDuJourEtProduit(
			CaisseDuJourDTO caisseDuJour, ProduitDTO produit,
			boolean venteAnimateur) {
		ResultSet rs = null;
		try {
			q4.setInt(1, caisseDuJour.getId());
			q4.setInt(2, produit.getId());
			q4.setBoolean(3, venteAnimateur);
			rs = q4.executeQuery();
			while (rs.next()) {
				return rs.getInt("quantite");
			}
		} catch (SQLException e) {
			System.out.println("[E][SQL] : ");
			e.printStackTrace();
		}
		return 0;
	}
}
